package AlgoritmosGeneticos.model.impl;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import utils.CustomRandom;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.OperadorCruce;
import AlgoritmosGeneticos.model.OperadorMutacion;
import AlgoritmosGeneticos.model.PoblacionSeleccionada;

public class PoblacionSeleccionadaImpl  implements PoblacionSeleccionada{


	private List<Individuo> progenitores;
	private List<Individuo> descendencia;
	

	public PoblacionSeleccionadaImpl(List<Individuo> progenitores){
		this.progenitores=progenitores;
	}
	

	@Override
	public void cruzar(OperadorCruce cruce) {
		descendencia = new LinkedList<Individuo>();
		while( descendencia.size() < progenitores.size()){
			int rand1 = CustomRandom.getRandomInt(progenitores.size());
			int rand2 = CustomRandom.getRandomInt(progenitores.size());;
//			System.out.println(rand1);
//			System.out.println(rand2);
			if( rand1 != rand2){
				descendencia.addAll(cruce.cruzar(progenitores.get(rand1),progenitores.get(rand2)));
			}
		}
	}

	@Override
	public void mutar(OperadorMutacion tipoMutacion) {
		if(descendencia == null)
			throw new IllegalArgumentException();
		
		for(Individuo i: descendencia){
				i.mutar(tipoMutacion);
		}
	}

	public List<Individuo> getProgenitores() {
		return progenitores;
	}

	@Override
	public String toString(){
		return progenitores.toString();
	}


	@Override
	public Collection<? extends Individuo> getDescendencia() {
		return this.descendencia;
	}
	
	
	public void AgregarIndividuos(PoblacionSeleccionadaImpl inds) {
		progenitores.addAll(inds.progenitores);
	}


	@Override
	public void AppendPoblacion(PoblacionSeleccionada ruletapob) {
		this.progenitores.addAll(((PoblacionSeleccionadaImpl)ruletapob).progenitores);
	}
}
